<!DOCTYPE html>
<html lang="zh-cn">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">




<title>数据库性能优化 | Miles`s</title>

<link rel="stylesheet" href="https://mada.gitee.io/notes//css/styles.css">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" 
integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>


<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/zenburn.min.css" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" integrity="sha256-/BfiIkHlHoVihZdc6TFuj7MmJ0TWcWsMXkeDFwhi0zw=" crossorigin="anonymous"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="https://mada.gitee.io/notes//js/highlight.js"></script>






<div class="container">
    <nav class="navbar level">
      <div class="navbar-brand">
          <a class="nav-item" href="https://mada.gitee.io/notes/"><h1 class="title is-3">Miles`s</h1></a>
      </div>           
      <div class="navbar-menu has-text-centered is-active">
          <div class="navbar-end is-centered">
              
           </div>
      </div>
    </nav>
  </div>
<div class="container">
  <h2 class="subtitle is-6">June 29, 2016</h2>
  <h1 class="subtitle is-size-4-mobile is-size-3-desktop">数据库性能优化</h1>
  <div class="content">
    

<h2 id="数据库性能优化">数据库性能优化</h2>

<h3 id="sql语句优化">SQL语句优化</h3>

<p>问题的提出：</p>

<p>应用系统开发初期，数据量少，对于查询sql语句，复杂视图的编写等体会不出sql语句各种写法的性能优劣。
随着数据量的增加，很重要的一方面就是sql语句优化。</p>

<p>在某些where子句中，即使某些列存在索引，但是由于编写呢劣质SQL，系统在运行该SQL语句时也不能使用该索引，而同样适用全表扫描，这就造成了极大的性能问题。</p>

<h4 id="操作符优化">操作符优化</h4>

<ol>
<li>IN
该操作符优点是比较容易写且清晰易懂。但是性能比较低。
在业务密集型sql当中尽量不用，采用EXISTS代替。</li>
<li>NOT IN
强烈不推荐使用，因为它不能应用表的索引。 NOT EXISTS</li>

<li><p>IS NULL 或 IS NOT NULL操作
值中只要出现null，索引就会从索引中排除。即使对该列添加索引也不会提高性能。
任何在wherei子句中使用is null 或 is not null 的语句优化器是不允许使用索引的。</p>

<p>推荐：
    相同功能操作运算符代替。 a is not null -&gt; a&gt;0 a&gt;&rsquo; &lsquo;等</p></li>

<li><p><code>&gt;</code> <code>&lt;</code> 等操作符</p></li>

<li><p>LIKE操作符
1.&lsquo;%5400%&rsquo; 这种查询不会引用索引， 而是添加如&rsquo;%X5400%&rsquo;
2.%通配符出现在搜索词首，一般不会使用索引。</p></li>

<li><p>UNION操作符
在进行表链接后会筛选掉重复的记录，所以在表链接后会产生的结果进行排序运算。删除重复的记录再返回结果。
推荐方案： union all</p></li>

<li><p>联接列
<code>select * from employss where first_name||''||last_name ='Beill Cliton';</code>不会使用索引
<code>where first_name ='Beill' and last_name ='Cliton';</code> 使用索引</p></li>

<li><p>order by语句
任何order by语句的非索引项或者优计算表达式都将降低查询速度。</p>

<ol>
<li>重写order by 语句使用索引。</li>
<li>为使用的列建立另外一个索引。</li>
</ol></li>

<li><p>NOT
不使用索引</p></li>
</ol>

<h4 id="sql书写的影响">SQL书写的影响</h4>

<ol>
<li>where后面的条件顺序影响
<code>
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1 
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
</code>
两条cpu占用率不一样。</li>
<li>查询表顺序的影响</li>
</ol>

<h4 id="sql语句索引的利用">SQL语句索引的利用</h4>

<ol>
<li>对条件字段的一些优化</li>
</ol>

<p>采用函数处理的字段不能利用索引</p>

<p>进行了显式或隐式的运算的字段不能进行索引：ss_df+20&gt;50 优化：ss_df&gt;30</p>

<p>bhs_bh = 2323,优化：hbs_bh=&lsquo;2323&rsquo;：隐式的转换</p>

<h4 id="更多优化资料">更多优化资料</h4>

<ol>
<li>select子句中避免使用 &lsquo;*&rsquo;: 会将其解析成列名</li>
<li>减少访问数据库的次数：</li>
<li>删除重复记录</li>
<li>用truncate替代 delete：存在回滚记录</li>
<li>尽量多使用commit：释放资源</li>
<li>用where子句替换having子句：只会在检索出所有记录之后才能对结果进行过滤。这个结果需要排序，总计等操作。</li>
<li>减少对表的查询：在含有子查询的语句中</li>
<li>通过内部函数提高sql效率</li>
<li>使用表的别名：减少解析的时间和语法错误</li>
<li>使用EXIST代替IN   not EXIST 代替not in</li>
<li>识别低效的sql语句：</li>
<li>利用索引提高效率：</li>
<li>用exist代替distinct</li>
<li>避免在索引列上使用计算</li>
<li>用 <code>&gt;=</code> 代替 <code>&gt;</code></li>
<li>用union代替or</li>
<li>避免改变索引类型
等。。。</li>
</ol>

  </div>
</div>
<div class="container has-text-centered">
    
</div>

<div class="container has-text-centered">
  
</div>
<section class="section">
  <div class="container has-text-centered">
    <p></p>
  </div>
</section>


